home *** CD-ROM | disk | FTP | other *** search
Text File | 2000-10-06 | 4.7 KB | 204 lines | [TEXT/CWIE] |
- ///--------------------------------------------------------------------------------------
- // BlitPixieRLECollision
- //
- // Written by Anders F Björklund <afb@algonet.se>
- // © 1998-99 afb.
- ///--------------------------------------------------------------------------------------
-
- #ifndef __BLITPIXIE__
- #include "BlitPixieHeader.h"
- #endif
-
- #ifndef GENERATINGASM // do not include for asm file generation
-
- #ifndef MIN
- #define MIN(a,b) (a < b ? a : b )
- #endif
- #ifndef MAX
- #define MAX(a,b) (a > b ? a : b )
- #endif
-
- #define ALIGN_PTR(p) ( -((long) p) & 3)
-
- ///--------------------------------------------------------------------------------------
- // BlitPixieRLECollision - checks two RLE sprites for solid span overlap
- ///--------------------------------------------------------------------------------------
-
- Boolean BlitPixieRLECollision(
- unsigned char *srcTokens,
- unsigned char *dstTokens,
- Rect *srcRect,
- Rect *dstRect)
- {
- unsigned long token1,op1,count1;
- unsigned long token2,op2,count2;
- unsigned char *nextRow1,*nextRow2;
- long x,width;
- long y,height;
- long x1,x2;
- int solid1,solid2;
-
- // advance source to first row
- for ( y = 0; y < srcRect->top; y++ )
- {
- token1 = *((TokenDataType *) srcTokens);
- srcTokens += sizeof(TokenDataType);
-
- op1 = token1 >> kTokenShift;
- count1 = token1 & kCountMask;
-
- if ( op1 == kLineStartToken )
- srcTokens += count1;
- else if ( op1 == kEndShapeToken )
- return false;
- else
- BLITPIXIE_DEBUGGER("BlitPixieRLECollision: Unexpected token");
- }
-
- // advance dest to first row
- for ( y = 0; y < dstRect->top; y++ )
- {
- token2 = *((TokenDataType *) dstTokens);
- dstTokens += sizeof(TokenDataType);
-
- op2 = token2 >> kTokenShift;
- count2 = token2 & kCountMask;
-
- if ( op2 == kLineStartToken )
- dstTokens += count2;
- else if ( op2 == kEndShapeToken )
- return false;
- else
- BLITPIXIE_DEBUGGER("BlitPixieRLECollision: Unexpected token");
- }
-
- height = srcRect->bottom - srcRect->top; // == dstRect->bottom - dstRect->top
- width = srcRect->right - srcRect->left; // == dstRect->right - dstRect->left
-
- // check the intersecting rows for span overlap
- for ( y = 0; y < height; y++ )
- {
- token1 = *((TokenDataType *) srcTokens);
- srcTokens += sizeof(TokenDataType);
-
- op1 = token1 >> kTokenShift;
- count1 = token1 & kCountMask;
-
- token2 = *((TokenDataType *) dstTokens);
- dstTokens += sizeof(TokenDataType);
-
- op2 = token2 >> kTokenShift;
- count2 = token2 & kCountMask;
-
- if ( op1 == kEndShapeToken || op2 == kEndShapeToken )
- return false;
-
- if ( op1 != kLineStartToken || op2 != kLineStartToken )
- BLITPIXIE_DEBUGGER("BlitPixieRLECollision: Unexpected token");
-
- nextRow1 = srcTokens + count1;
- nextRow2 = dstTokens + count2;
-
- op1 = -1;
- op2 = -1;
- solid1 = false;
- solid2 = false;
- x1 = - srcRect->left;
- x2 = - dstRect->left;
-
- for ( x = x1 < x2 ? x1 : x2 ; x < width; x = x1 < x2 ? x1 : x2 )
- {
- if ( x1 < x2 )
- {
- token1 = *((TokenDataType *) srcTokens);
- srcTokens += sizeof(TokenDataType);
-
- op1 = token1 >> kTokenShift;
- count1 = token1 & kCountMask;
-
- switch ( op1 )
- {
- case kDrawPixelsToken:
- solid1 = true;
- x1 += count1;
- srcTokens += count1;
- srcTokens += ALIGN_PTR(srcTokens);
- break;
- case kSkipPixelsToken:
- solid1 = false;
- x1 += count1;
- break;
- #if BLITPIXIE_USE_DRAW_SPANS
- case kSingleColorToken:
- solid1 = true;
- x1 += count1;
- srcTokens += 4;
- break;
- #endif
- case kLineStartToken:
- solid1 = false;
- x1 = width;
- break;
- case kEndShapeToken:
- return false;
- default:
- BLITPIXIE_DEBUGGER("BlitPixieRLECollision: Unknown token");
- }
-
- }
- else // if ( x1 >= x2 )
- {
- token2 = *((TokenDataType *) dstTokens);
- dstTokens += sizeof(TokenDataType);
-
- op2 = token2 >> kTokenShift;
- count2 = token2 & kCountMask;
-
- switch ( op2 )
- {
- case kDrawPixelsToken:
- solid2 = true;
- x2 += count2;
- dstTokens += count2;
- dstTokens += ALIGN_PTR(dstTokens);
- break;
- case kSkipPixelsToken:
- solid2 = false;
- x2 += count2;
- break;
- #if BLITPIXIE_USE_DRAW_SPANS
- case kSingleColorToken:
- solid2 = true;
- x2 += count2;
- dstTokens += 4;
- break;
- #endif
- case kLineStartToken:
- solid2 = false;
- x2 = width;
- break;
- case kEndShapeToken:
- return false;
- default:
- BLITPIXIE_DEBUGGER("BlitPixieRLECollision: Unknown token");
- }
- }
-
- if ( solid1 && solid2 )
- return true;
-
- if ( op1 == kLineStartToken || op2 == kLineStartToken )
- break;
- }
-
- srcTokens = nextRow1;
- dstTokens = nextRow2;
- }
-
- return false;
- }
-
- #endif //GENERATINGASM
-
-
-